package pe.gob.mininter.dirandro.vaadin.panel.informe;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.Notificacion;
import pe.gob.mininter.dirandro.model.SeguimientoNot;
import pe.gob.mininter.dirandro.service.SeguimientoNotService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Button;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;

@SuppressWarnings("serial")
public class PanelRegistroInformeSeguimientoNotificacion extends CustomComponent implements ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private Table tblSeguimientoNotificacion;
	@AutoGenerated
	private HorizontalLayout lytFormulario2;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private TextArea txtADescripcion;
	@AutoGenerated
	private Label lblDescripcion;
	@AutoGenerated
	private HorizontalLayout lytFormulario1;
	@AutoGenerated
	private PopupDateField dtFechaRecepcionF;
	@AutoGenerated
	private Label lblFechaRecepcionF;
	@AutoGenerated
	private ComboBoxLOVS cmbEstadoSeguimiento;
	@AutoGenerated
	private Label lblEstadoSeguimiento;
	@AutoGenerated
	private Label lblFormulario;
	@AutoGenerated
	private HorizontalLayout lytDatosNotificacion2;
	@AutoGenerated
	private TextField txtEstadoNotificacion;
	@AutoGenerated
	private Label lblEstadoNotificacion;
	@AutoGenerated
	private TextField txtFechaVencimiento;
	@AutoGenerated
	private Label lblFechaVencimiento;
	@AutoGenerated
	private HorizontalLayout lytDatosNotificacion1;
	@AutoGenerated
	private TextField txtFechaRecepcion;
	@AutoGenerated
	private Label lblFechaRecepcion;
	@AutoGenerated
	private TextField txtTipoNotificacion;
	@AutoGenerated
	private Label lblTipoNotificacion;
	@AutoGenerated
	private Label lblDatosNotificacion;
	
	private SeguimientoNotService seguimientoNotService;
	private Notificacion notificacion;
	
	public static final String COLUMNA_ESTADO_SEGUIMIENTO = "estado_seguimiento";
	public static final String COLUMNA_FECHA_RECEPCION_NOTIFICACION = "fecha_recepcion_notificacion";
	public static final String COLUMNA_DESCRIPCION_SEGUIMIENTO = "descripcion_seguimiento";
	public static final String COLUMNA_OPCION_ELIMINAR = "eliminar";
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelRegistroInformeSeguimientoNotificacion(Notificacion notificacion) {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		seguimientoNotService=Injector.obtenerServicio(SeguimientoNotService.class);
		this.notificacion=notificacion;
		postConstruct();
	}

	public void postConstruct(){
		
		DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
		
		txtTipoNotificacion.setValue(notificacion.getTipoNotificacion().getNombre());
		txtTipoNotificacion.setNullRepresentation(StringUtils.EMPTY);
		txtTipoNotificacion.setEnabled(false);
		txtFechaRecepcion.setValue(notificacion.getFechaRecepcion()==null?
				null:df.format(notificacion.getFechaRecepcion()));
		txtFechaRecepcion.setNullRepresentation(StringUtils.EMPTY);
		txtFechaRecepcion.setEnabled(false);
		txtFechaVencimiento.setValue(notificacion.getFechaVencimiento()==null?
				null:df.format(notificacion.getFechaVencimiento()));
		txtFechaVencimiento.setNullRepresentation(StringUtils.EMPTY);
		txtFechaVencimiento.setEnabled(false);
		txtEstadoNotificacion.setValue(notificacion.getEstado()==null?
				null:notificacion.getEstado().getNombre());
		txtEstadoNotificacion.setNullRepresentation(StringUtils.EMPTY);
		txtEstadoNotificacion.setEnabled(false);
		
		cmbEstadoSeguimiento.setCodigoLista(Constante.LISTA.CODIGO.ESTADO_SEGUI);
		cmbEstadoSeguimiento.setInputPrompt("Estado Seguimiento");
		
		dtFechaRecepcionF.setInputPrompt("Fecha Recepcion Notificacion");
		
		txtADescripcion.setNullRepresentation(StringUtils.EMPTY);
		
		btnGuardar.addListener(this);
		
		cargarDatos();
		
	}
	
	private void limpiar(){
		cmbEstadoSeguimiento.setValue(null);
		dtFechaRecepcionF.setValue(null);
		txtADescripcion.setValue(null);
	}
	
	private void cargarDatos(){
		SeguimientoNot seguimientoNotBuscar=new SeguimientoNot();
		seguimientoNotBuscar.setNotificacion(notificacion);
		List<SeguimientoNot> seguimientoNots=seguimientoNotService.buscar(seguimientoNotBuscar);
		
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty(COLUMNA_ESTADO_SEGUIMIENTO, String.class,  null);
        container.addContainerProperty(COLUMNA_FECHA_RECEPCION_NOTIFICACION, String.class,  null);
        container.addContainerProperty(COLUMNA_DESCRIPCION_SEGUIMIENTO, String.class,  null);
        container.addContainerProperty(COLUMNA_OPCION_ELIMINAR, Button.class,  null);
        
        DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
        
        int con=1;
		for (final SeguimientoNot seguimientoNot : seguimientoNots) {
			Item item=container.addItem(con++);
			item.getItemProperty(COLUMNA_ESTADO_SEGUIMIENTO).setValue(seguimientoNot.getEstadoSeguimiento()==null?null:seguimientoNot.getEstadoSeguimiento().getNombre());
			item.getItemProperty(COLUMNA_FECHA_RECEPCION_NOTIFICACION).setValue(seguimientoNot.getFechaRecepcion()==null?null:df.format(seguimientoNot.getFechaRecepcion()));
			item.getItemProperty(COLUMNA_DESCRIPCION_SEGUIMIENTO).setValue(seguimientoNot.getDetalle());
			Button eliminar=new Button();
			eliminar.setCaption("Eliminar");
			eliminar.addListener(new ClickListener() {
				
				@Override
				public void buttonClick(ClickEvent event) {
					seguimientoNotService.eliminar(seguimientoNot);
					cargarDatos();
				}
			});
			item.getItemProperty(COLUMNA_OPCION_ELIMINAR).
			setValue(eliminar);
		}
        
        tblSeguimientoNotificacion.setContainerDataSource(container);
        tblSeguimientoNotificacion.setVisibleColumns(new Object[]{COLUMNA_ESTADO_SEGUIMIENTO, 
        		COLUMNA_FECHA_RECEPCION_NOTIFICACION, COLUMNA_DESCRIPCION_SEGUIMIENTO, 
        		COLUMNA_OPCION_ELIMINAR});
        tblSeguimientoNotificacion.setColumnWidth(COLUMNA_ESTADO_SEGUIMIENTO, 100);
        tblSeguimientoNotificacion.setColumnWidth(COLUMNA_FECHA_RECEPCION_NOTIFICACION, 100);
        tblSeguimientoNotificacion.setColumnWidth(COLUMNA_DESCRIPCION_SEGUIMIENTO, 100);
        tblSeguimientoNotificacion.setColumnWidth(COLUMNA_OPCION_ELIMINAR, 100);
        tblSeguimientoNotificacion.setColumnHeader(COLUMNA_ESTADO_SEGUIMIENTO, "Estado");
        tblSeguimientoNotificacion.setColumnHeader(COLUMNA_FECHA_RECEPCION_NOTIFICACION, "F. Recepcion");
        tblSeguimientoNotificacion.setColumnHeader(COLUMNA_DESCRIPCION_SEGUIMIENTO, "Descripcion");
        tblSeguimientoNotificacion.setColumnHeader(COLUMNA_OPCION_ELIMINAR, "");
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar)){
			SeguimientoNot seguimientoNot=new SeguimientoNot();
			seguimientoNot.setNotificacion(notificacion);
			seguimientoNot.setEstadoSeguimiento(cmbEstadoSeguimiento.getValor());
			seguimientoNot.setFechaRecepcion((Date)dtFechaRecepcionF.getValue());
			seguimientoNot.setDetalle((String)txtADescripcion.getValue());
			seguimientoNotService.crear(seguimientoNot);
			limpiar();
			cargarDatos();
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(false);
		pnlPrincipal.setSpacing(true);
		
		// lblDatosNotificacion
		lblDatosNotificacion = new Label();
		lblDatosNotificacion.setStyleName("h2");
		lblDatosNotificacion.setImmediate(false);
		lblDatosNotificacion.setWidth("-1px");
		lblDatosNotificacion.setHeight("-1px");
		lblDatosNotificacion.setValue("Datos de Notificacion");
		pnlPrincipal.addComponent(lblDatosNotificacion);
		
		// lytDatosNotificacion1
		lytDatosNotificacion1 = buildLytDatosNotificacion1();
		pnlPrincipal.addComponent(lytDatosNotificacion1);
		
		// lytDatosNotificacion2
		lytDatosNotificacion2 = buildLytDatosNotificacion2();
		pnlPrincipal.addComponent(lytDatosNotificacion2);
		
		// lblFormulario
		lblFormulario = new Label();
		lblFormulario.setStyleName("h2");
		lblFormulario.setImmediate(false);
		lblFormulario.setWidth("-1px");
		lblFormulario.setHeight("-1px");
		lblFormulario.setValue("Formulario");
		pnlPrincipal.addComponent(lblFormulario);
		
		// lytFormulario1
		lytFormulario1 = buildLytFormulario1();
		pnlPrincipal.addComponent(lytFormulario1);
		
		// lytFormulario2
		lytFormulario2 = buildLytFormulario2();
		pnlPrincipal.addComponent(lytFormulario2);
		
		// tblSeguimientoNotificacion
		tblSeguimientoNotificacion = new Table();
		tblSeguimientoNotificacion.setImmediate(false);
		tblSeguimientoNotificacion.setWidth("600px");
		tblSeguimientoNotificacion.setHeight("200px");
		pnlPrincipal.addComponent(tblSeguimientoNotificacion);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildLytDatosNotificacion1() {
		// common part: create layout
		lytDatosNotificacion1 = new HorizontalLayout();
		lytDatosNotificacion1.setImmediate(false);
		lytDatosNotificacion1.setWidth("-1px");
		lytDatosNotificacion1.setHeight("-1px");
		lytDatosNotificacion1.setMargin(false);
		lytDatosNotificacion1.setSpacing(true);
		
		// lblTipoNotificacion
		lblTipoNotificacion = new Label();
		lblTipoNotificacion.setImmediate(false);
		lblTipoNotificacion.setWidth("160px");
		lblTipoNotificacion.setHeight("-1px");
		lblTipoNotificacion.setValue("Tipo Notificacion");
		lytDatosNotificacion1.addComponent(lblTipoNotificacion);
		
		// txtTipoNotificacion
		txtTipoNotificacion = new TextField();
		txtTipoNotificacion.setImmediate(false);
		txtTipoNotificacion.setWidth("150px");
		txtTipoNotificacion.setHeight("-1px");
		lytDatosNotificacion1.addComponent(txtTipoNotificacion);
		
		// lblFechaRecepcion
		lblFechaRecepcion = new Label();
		lblFechaRecepcion.setImmediate(false);
		lblFechaRecepcion.setWidth("160px");
		lblFechaRecepcion.setHeight("-1px");
		lblFechaRecepcion.setValue("Fecha Recepcion Notificacion");
		lytDatosNotificacion1.addComponent(lblFechaRecepcion);
		
		// txtFechaRecepcion
		txtFechaRecepcion = new TextField();
		txtFechaRecepcion.setImmediate(false);
		txtFechaRecepcion.setWidth("150px");
		txtFechaRecepcion.setHeight("-1px");
		lytDatosNotificacion1.addComponent(txtFechaRecepcion);
		
		return lytDatosNotificacion1;
	}

	@AutoGenerated
	private HorizontalLayout buildLytDatosNotificacion2() {
		// common part: create layout
		lytDatosNotificacion2 = new HorizontalLayout();
		lytDatosNotificacion2.setImmediate(false);
		lytDatosNotificacion2.setWidth("-1px");
		lytDatosNotificacion2.setHeight("-1px");
		lytDatosNotificacion2.setMargin(false);
		lytDatosNotificacion2.setSpacing(true);
		
		// lblFechaVencimiento
		lblFechaVencimiento = new Label();
		lblFechaVencimiento.setImmediate(false);
		lblFechaVencimiento.setWidth("160px");
		lblFechaVencimiento.setHeight("-1px");
		lblFechaVencimiento.setValue("Fecha Vencimiento PRI");
		lytDatosNotificacion2.addComponent(lblFechaVencimiento);
		
		// txtFechaVencimiento
		txtFechaVencimiento = new TextField();
		txtFechaVencimiento.setImmediate(false);
		txtFechaVencimiento.setWidth("150px");
		txtFechaVencimiento.setHeight("-1px");
		lytDatosNotificacion2.addComponent(txtFechaVencimiento);
		
		// lblEstadoNotificacion
		lblEstadoNotificacion = new Label();
		lblEstadoNotificacion.setImmediate(false);
		lblEstadoNotificacion.setWidth("160px");
		lblEstadoNotificacion.setHeight("-1px");
		lblEstadoNotificacion.setValue("Estado Notificacion");
		lytDatosNotificacion2.addComponent(lblEstadoNotificacion);
		
		// txtEstadoNotificacion
		txtEstadoNotificacion = new TextField();
		txtEstadoNotificacion.setImmediate(false);
		txtEstadoNotificacion.setWidth("150px");
		txtEstadoNotificacion.setHeight("-1px");
		lytDatosNotificacion2.addComponent(txtEstadoNotificacion);
		
		return lytDatosNotificacion2;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario1() {
		// common part: create layout
		lytFormulario1 = new HorizontalLayout();
		lytFormulario1.setImmediate(false);
		lytFormulario1.setWidth("-1px");
		lytFormulario1.setHeight("-1px");
		lytFormulario1.setMargin(false);
		lytFormulario1.setSpacing(true);
		
		// lblEstadoSeguimiento
		lblEstadoSeguimiento = new Label();
		lblEstadoSeguimiento.setImmediate(false);
		lblEstadoSeguimiento.setWidth("160px");
		lblEstadoSeguimiento.setHeight("-1px");
		lblEstadoSeguimiento.setValue("Estado Seguimiento");
		lytFormulario1.addComponent(lblEstadoSeguimiento);
		
		// cmbEstadoSeguimiento
		cmbEstadoSeguimiento = new ComboBoxLOVS();
		cmbEstadoSeguimiento.setImmediate(false);
		cmbEstadoSeguimiento.setWidth("150px");
		cmbEstadoSeguimiento.setHeight("-1px");
		lytFormulario1.addComponent(cmbEstadoSeguimiento);
		
		// lblFechaRecepcionF
		lblFechaRecepcionF = new Label();
		lblFechaRecepcionF.setImmediate(false);
		lblFechaRecepcionF.setWidth("160px");
		lblFechaRecepcionF.setHeight("-1px");
		lblFechaRecepcionF.setValue("Fecha Recepcion Notificacion");
		lytFormulario1.addComponent(lblFechaRecepcionF);
		
		// dtFechaRecepcionF
		dtFechaRecepcionF = new PopupDateField();
		dtFechaRecepcionF.setImmediate(false);
		dtFechaRecepcionF.setWidth("150px");
		dtFechaRecepcionF.setHeight("-1px");
		dtFechaRecepcionF.setResolution(4);
		lytFormulario1.addComponent(dtFechaRecepcionF);
		
		return lytFormulario1;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario2() {
		// common part: create layout
		lytFormulario2 = new HorizontalLayout();
		lytFormulario2.setImmediate(false);
		lytFormulario2.setWidth("-1px");
		lytFormulario2.setHeight("-1px");
		lytFormulario2.setMargin(false);
		lytFormulario2.setSpacing(true);
		
		// lblDescripcion
		lblDescripcion = new Label();
		lblDescripcion.setImmediate(false);
		lblDescripcion.setWidth("160px");
		lblDescripcion.setHeight("-1px");
		lblDescripcion.setValue("Descripcion Seguimiento");
		lytFormulario2.addComponent(lblDescripcion);
		
		// txtADescripcion
		txtADescripcion = new TextArea();
		txtADescripcion.setImmediate(false);
		txtADescripcion.setWidth("200px");
		txtADescripcion.setHeight("100px");
		lytFormulario2.addComponent(txtADescripcion);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Agregar");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		lytFormulario2.addComponent(btnGuardar);
		
		return lytFormulario2;
	}

}
